<!DOCTYPE html><html lang="zh-cn"><head><link rel=manifest href=/manifest.json><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="format-detection" content="telephone=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><link rel="icon" href="/images/icons/icon.jpg?v=2.0.0-rc.0" type="image/png" sizes="16x16"><link rel="icon" href="/images/icons/icon.jpg?v=2.0.0-rc.0" type="image/png" sizes="32x32"><meta name="description" content="万恶的期末考试要来了，这里做一个简单的操作系统重点知识整理。核心的部分会放在进程，处理机调度和死锁以及处理器那一块。持续更新……     co-author: @czhorz">
<meta name="keywords" content="技术探究">
<meta property="og:type" content="article">
<meta property="og:title" content="操作系统重点知识整理">
<meta property="og:url" content="https:&#x2F;&#x2F;mikyming.online&#x2F;2020&#x2F;12&#x2F;26&#x2F;%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E9%87%8D%E7%82%B9%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86&#x2F;">
<meta property="og:site_name" content="MikyMing&#39;s Blog">
<meta property="og:description" content="万恶的期末考试要来了，这里做一个简单的操作系统重点知识整理。核心的部分会放在进程，处理机调度和死锁以及处理器那一块。持续更新……     co-author: @czhorz">
<meta property="og:locale" content="zh-cn">
<meta property="og:updated_time" content="2021-01-18T11:33:44.681Z">
<meta name="twitter:card" content="summary"><meta name="keywords" content="MikyMing, MikyMing's Blog"><meta name="description" content="技术,生活"><title>操作系统重点知识整理 | MikyMing's Blog</title><link ref="canonical" href="https://mikyming.online/2020/12/26/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E9%87%8D%E7%82%B9%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86/"><link rel="alternate" href="/atom.xml" type="application/atom+xml"><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.12.1/css/all.min.css" type="text/css"><link rel="stylesheet" href="/css/index.css?v=2.0.0-rc.0"><script>var Stun = window.Stun || {};
var CONFIG = {
  root: '/',
  algolia: undefined,
  fontIcon: {"prompt":{"success":"fas fa-check-circle","info":"fas fa-arrow-circle-right","warning":"fas fa-exclamation-circle","error":"fas fa-times-circle"},"copyBtn":"fas fa-copy"},
  sidebar: {"offsetTop":"20px","tocMaxDepth":6},
  header: {"enable":true,"showOnPost":false,"scrollDownIcon":true},
  postWidget: {"endText":true},
  nightMode: {"enable":true},
  back2top: {"enable":true},
  codeblock: {"style":"default","highlight":"ocean","wordWrap":false},
  reward: false,
  fancybox: false,
  zoomImage: {"gapAside":"20px"},
  galleryWaterfall: undefined,
  lazyload: false,
  pjax: undefined,
  externalLink: {"icon":{"enable":true,"name":"fas fa-external-link-alt"}},
  shortcuts: {"switchPost":true},
  prompt: {"copyButton":"Copy","copySuccess":"Copy Success","copyError":"Copy Error"},
  sourcePath: {"js":"js","css":"css","images":"images"},
};

window.CONFIG = CONFIG;</script></head><body><div class="container" id="container"><header class="header" id="header"><div class="header-inner header-inner--height header-inner--bgcolor"><nav class="header-nav header-nav--sticky"><div class="header-nav-inner"><div class="header-nav-menubtn"><i class="fas fa-bars"></i></div><div class="header-nav-menu"><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/"><span class="header-nav-menu-item__icon"><i class="fas fa-home"></i></span><span class="header-nav-menu-item__text">Home</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/archives/"><span class="header-nav-menu-item__icon"><i class="fas fa-folder-open"></i></span><span class="header-nav-menu-item__text">Archives</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/categories/"><span class="header-nav-menu-item__icon"><i class="fas fa-layer-group"></i></span><span class="header-nav-menu-item__text">Categories</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/tags/"><span class="header-nav-menu-item__icon"><i class="fas fa-tags"></i></span><span class="header-nav-menu-item__text">Tags</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="javascript:;" target="_blank" rel="noopener" onclick="return false;"><span class="header-nav-menu-item__icon"><i class="fa fa-address-book"></i></span><span class="header-nav-menu-item__text">友链</span></a><div class="header-nav-submenu"><div class="header-nav-submenu-item"><a class="header-nav-submenu-item__link" href="https://www.bobby285271.top/" target="_blank" rel="noopener"><span class="header-nav-submenu-item__text">BobbyRong</span></a></div><div class="header-nav-submenu-item"><a class="header-nav-submenu-item__link" href="https://blog.ojhdt.com/" target="_blank" rel="noopener"><span class="header-nav-submenu-item__text">ojhdt</span></a></div></div></div></div><div class="header-nav-search"><span class="header-nav-search__icon"><i class="fas fa-search"></i></span><span class="header-nav-search__text">Search</span></div><div class="header-nav-mode"><div class="mode"><div class="mode-track"><span class="mode-track-moon"></span><span class="mode-track-sun"></span></div><div class="mode-thumb"></div></div></div></div></nav></div></header><main class="main" id="main"><div class="main-inner"><div class="content-wrap" id="content-wrap"><div class="content" id="content"><!-- Just used to judge whether it is an article page--><div id="is-post"></div><div class="post"><header class="post-header"><h1 class="post-title">操作系统重点知识整理</h1><div class="post-meta"><span class="post-meta-item post-meta-item--createtime"><span class="post-meta-item__icon"><i class="far fa-calendar-plus"></i></span><span class="post-meta-item__info">Created</span><span class="post-meta-item__value">2020-12-26</span></span><span class="post-meta-item post-meta-item--updatetime"><span class="post-meta-item__icon"><i class="far fa-calendar-check"></i></span><span class="post-meta-item__info">Updated</span><span class="post-meta-item__value">2021-01-18</span></span><span class="post-meta-item post-meta-item--wordcount"><span class="post-meta-item__icon"><i class="far fa-file-word"></i></span><span class="post-meta-item__info">Words</span><span class="post-meta-item__value">13.4k</span></span><span class="post-meta-item post-meta-item--visitors"><span class="post-meta-item__icon" data-popover="Visitors" data-popover-pos="up"><i class="fas fa-eye"></i></span><span class="post-meta-item__value" id="busuanzi_value_page_pv"></span></span></div></header><div class="post-body"><p>万恶的期末考试要来了，这里做一个简单的操作系统重点知识整理。核心的部分会放在进程，处理机调度和死锁以及处理器那一块。持续更新……     co-author: <span class="exturl"><a class="exturl__link"   href="https://github.com/czhorz"  target="_blank" rel="noopener">@czhorz</a><span class="exturl__icon"><i class="fas fa-external-link-alt"></i></span></span></p>
<a id="more"></a>


        <h2 id="第一章-操作系统引论"   >
          <a href="#第一章-操作系统引论" class="heading-link"><i class="fas fa-link"></i></a>第一章 操作系统引论</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li>设计现代OS的主要目标是什么？</li>
</ol>
<p>有效性，方便性，可扩充性，开放性</p>
<ol start="2">
<li>OS的作用可表现在哪几个方面？</li>
</ol>
<p>（1）OS 作为用户与计算机硬件系统之间的接口<br>（2）OS 作为计算机系统资源的管理者<br>（3）OS 实现了对计算机资源的抽象</p>
<ol start="3">
<li>为什么说操作系统实现了对计算机资源的抽象？</li>
</ol>
<p>OS 首先在裸机上覆盖一层I/O 设备管理软件，实现了对计算机硬件操作的第一层次抽象；在第一层软件上再覆盖文件管理软件，实现了对硬件资源操作的第二层次抽象。OS 通过在计算机硬件上安装多层系统软件，增强了系统功能，隐藏了对硬件操作的细节，由它们共同实现了对计算机资源的抽象。</p>
<ol start="4">
<li>何谓脱机I/O和联机I/O？</li>
</ol>
<p>脱机I/O 是指事先将装有用户程序和数据的纸带或卡片装入纸带输入机或卡片机，在外围机的控制下，把纸带或卡片上的数据或程序输入到磁带上。该方式下的输入输出由外围机控制完成，是在脱离主机的情况下进行的。而联机I/O 方式是指程序和数据的输入输出都是在主机的直接控制下进行的。</p>
<ol start="5">
<li>什么是硬实时任务和软实时任务？举例</li>
</ol>
<p>实时任务是指系统必须满足任务对截止时间的要求，否则可能出现难以预测的结果。<br>举例来说，运载火箭的控制等。<br>软实时任务是指它的截止时间并不严格，偶尔错过了任务的截止时间，对系统产生的影响不大。举例：网页内容的更新、火车售票系统。</p>
<ol start="6">
<li>试从交互性、及时性以及可靠性方面将分时系统与实时系统进行比较。</li>
</ol>
<p>（1）及时性：实时信息处理系统对实时性的要求与分时系统类似，都是以人所能接受的等待时间来确定；而实时控制系统的及时性，是以控制对象所要求的开始截止时间或完成截止时间来确定的，一般为秒级到毫秒级，甚至有的要低于100 微妙。<br>（2）交互性：实时信息处理系统具有交互性，但人与系统的交互仅限于访问系统中某些特定的专用服务程序。不像分时系统那样能向终端用户提供数据和资源共享等服务。<br>（3）可靠性：分时系统也要求系统可靠，但相比之下，实时系统则要求系统具有高度的可靠性。因为任何差错都可能带来巨大的经济损失，甚至是灾难性后果，所以在实时系统中，往往都采取了多级容错措施保障系统的安全性及数据的安全性。</p>
<ol start="7">
<li>OS有哪几大特征？其最基本的特征是什么？</li>
</ol>
<p>并发性、共享性、虚拟性和异步性四个基本特征；最基本的特征是并发性。</p>
<ol start="8">
<li><strong>什么是时分复用技术？举例说明它能提高资源利用率的根本原因是什么？</strong></li>
</ol>
<p>时分复用技术:将资源在不同的时间片内分配给各进程以使该资源被重复利用,从而提高资源的利用率。如采用时分复用技术的虚拟处理机,能够在不同的时间片内处理多个用户的请求, 从而使得用户感觉自己独占主机,而处理机在这期间也被充分的利用</p>
<ol start="9">
<li>是什么原因使操作系统具有异步性特征？</li>
</ol>
<p>操作系统的异步性体现在三个方面：<br>一是进程的异步性，进程以人们不可预知的速度向前推进，<br>二是程序的不可再现性，即程序执行的结果有时是不确定的，<br>三是程序执行时间的不可预知性，即每个程序何时执行，执行顺序以及完成时间是不确定的。</p>
<ol start="10">
<li>处理机管理有哪些主要功能？其主要目的是什么？</li>
</ol>
<p>处理机管理的主要功能是：进程管理、进程同步、进程通信和处理机调度；<br>进程管理：为作业创建进程，撤销已结束进程，控制进程在运行过程中的状态转换。<br>进程同步：为多个进程（含线程）的运行进行协调。<br>通信：用来实现在相互合作的进程之间的信息交换。<br>处理机调度：<br>（1 ）作业调度。从后备队里按照一定的算法，选出若干个作业，为他们分配运行所需的资源（首选是分配内存）。<br>（2 ）进程调度：从进程的就绪队列中，按照一定算法选出一个进程，把处理机分配给它，并设置运行现场，使进程投入执行。</p>
<ol start="11">
<li>内存管理有哪些主要功能 ? 他们的主要任务是什么？</li>
</ol>
<p>内存管理的主要功能有：内存分配、内存保护、地址映射和内存扩充。<br>内存分配：为每道程序分配内存。<br>内存保护：确保每道用户程序都只在自己的内存空间运行，彼此互不干扰。<br>地址映射：将地址空间的逻辑地址转换为内存空间与对应的物理地址。内存扩充：用于实现请求调用功能，置换功能等。</p>
<ol start="12">
<li>设备管理有哪些主要功能？其主要任务是什么？</li>
</ol>
<p>主要功能有: 缓冲管理、设备分配和设备处理以及虚拟设备等。<br>主要任务:  完成用户提出的I/O 请求，为用户分配I/O 设备；提高CPU 和I/O 设备的利用率；提高I/O 速度；以及方便用户使用I/O 设备.</p>
<ol start="13">
<li>文件管理有哪些主要功能？其主要任务是什么？</li>
</ol>
<p>文件管理主要功能：文件存储空间的管理、目录管理、文件的读/写管理和保护。文件管理的主要任务：管理用户文件和系统文件，方便用户使用，保证文件安全性。</p>

        <h2 id="第二章-进程的描述与控制"   >
          <a href="#第二章-进程的描述与控制" class="heading-link"><i class="fas fa-link"></i></a>第二章 进程的描述与控制</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li>练习题，P91，T2</li>
<li>为什么程序并发执行会产生间断性特征？</li>
</ol>
<p>程序在并发执行时，由于它们共享系统资源，为完成同一项任务需要相互合作，致使这些并发执行的进程之间，形成了相互制约关系，从而使得进程在执行期间出现间断性。</p>
<ol start="3">
<li>在操作系统中为什么要引入进程概念？它会产生什么样的影响?</li>
</ol>
<p>为了使程序在多道程序环境下能并发执行，并对并发执行的程序加以控制和描述，在操作系统中引入了进程概念</p>
<ol start="4">
<li>试从动态性，并发性和独立性上比较进程和程序?</li>
</ol>
<p>(1)动态性是进程最基本的特性，表现为由创建而产生，由调度而执行，因得不到资源而暂停执行，由撤销而消亡。<strong>进程有一定的生命期，而程序只是一组有序的指令集合，是静态实体。</strong><br>(2)并发性是进程的重要特征，同时也是OS 的重要特征。引入进程的目的正是为了使其程序能和其它进程的程序并发执行，而程序是不能并发执行的。<br>(3)独立性是指进程实体是一个能独立运行的基本单位，也是系统中独立获得资源和独立调度的基本单位。对于未建立任何进程的程序，不能作为独立单位参加运行。</p>
<ol start="5">
<li>试说明PCB 的作用，为什么说PCB 是进程存在的惟一标志？</li>
</ol>
<p>PCB 是进程实体的一部分，是操作系统中最重要的记录型<strong>数据结构</strong>。作用是使一个在多道程序环境下不能独立运行的程序，成为一个能独立运行的基本单位，成为能与其它进程并发执行的进程。OS是根据PCB对并发执行的进程进行控制和管理的。</p>
<ol start="6">
<li>PCB提供了进程管理和进程调度所需要的哪些信息？</li>
</ol>
<p>进程管理：通用寄存器、指令寄存器、程序状态字、用户栈指针</p>
<p>进程调度：进程状态、进程优先级、事件、其他信息</p>
<ol start="6">
<li>进程控制块的组织方式有哪几种？</li>
</ol>
<p>1）线性表方式：不论进程的状态如何，将所有的PCB连续地存放在内存的系统区。这种方式适用于系统中进程数目不多的情况。<br>2）索引表方式：该方式是线性表方式的改进，系统按照进程的状态分别建立就绪索引表、阻塞索引表等。<br>3）链接表方式：系统按照进程的状态将进程的PCB组成队列，从而形成就绪队列、阻塞队列、运行队列等。</p>
<ol start="7">
<li>何谓操作系统内核？内核的主要功能是什么？</li>
</ol>
<p>操作系统内核是指大多数操作系统的核心部分。它由操作系统中用于管理存储器、文件、外设和系统资源的那些部分组成。操作系统内核通常运行进程,并提供进程间的通信</p>
<ol start="8">
<li>试说明进程在三个基本状态之间转换的典型原因。</li>
</ol>
<p>（1）就绪状态→执行状态：进程分配到CPU资源<br>（2）执行状态→就绪状态：时间片用完<br>（3）执行状态→阻塞状态：I/O请求<br>（4）阻塞状态→就绪状态：I/O完成</p>
<ol start="10">
<li>试从调度性、并发性、拥有资源及系统开销方面对进程和线程进行比较。</li>
</ol>
<p>（1）调度性。<br>在传统的操作系统中，拥有资源的基本单位和独立调度、分派的基本单位都是进程，在引入线程的OS中，则把线程作为调度和分派的基本单位，而把进程作为资源拥有的基本单位；<br>（2）并发性。<br>在引入线程的OS中，不仅进程之间可以并发执行，而且在一个进程中的多个线程之间，亦可并发执行，因而使OS具有更好的并发性；<br>（3）拥有资源。<br>无论是传统的操作系统，还是引入了线程的操作系统，进程始终是拥有资源的一个基本单位，而线程除了拥有一点在运行时必不可少的资源外，本身基本不拥有系统资源，但它可以访问其隶属进程的资源；<br>（4）开销。<br>由于创建或撤销进程时，系统都要为之分配和回收资源，如内存空间等，进程切换时所要保存和设置的现场信息也要明显地多于线程，因此，操作系统在创建、撤消和切换进程时所付出的开销将显著地大于线程。</p>
<ol start="11">
<li>线程控制块TCB包含了哪些内容？</li>
</ol>
<p>线程标识符</p>
<p>一组寄存器<br>   通用寄存器<br>   程序计数器PC<br>   状态寄存器</p>
<p>线程运行状态</p>
<p>优先级</p>
<p>线程专有存储区</p>
<p>信号屏蔽</p>
<p>堆栈指针</p>

        <h2 id="第三章-处理机调度和死锁"   >
          <a href="#第三章-处理机调度和死锁" class="heading-link"><i class="fas fa-link"></i></a>第三章 处理机调度和死锁</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li>高级调度与低级调度的主要任务是什么？为什么要引入中级调度？</li>
</ol>
<p>高级调度的主要任务是根据某种算法，把外存上处于后备队列中的那些作业调入内存。<br>低级调度是保存处理机的现场信息，按某种算法先取进程，再把处理器分配给进程。<br>引入中级调度的主要目的是为了提高内存利用率和系统吞吐量。<br>使那些暂时不能运行的进程不再占用内存资源，将它们调至外存等待，把进程状态改为就绪驻外存状态或挂起状态。</p>
<ol start="2">
<li>处理机调度算法的共同目标是什么？批处理系统的调度目标又是什么？</li>
</ol>
<p>共同目标:资源利用率,公平性,平衡性,策略强制执行。 <br>批处理系统的调度目标：平均周转时间短，系统吞吐量高，处理机利用率高。</p>
<ol start="2">
<li>在抢占调度方式中，抢占的原则是什么？</li>
</ol>
<p>抢占的原则有：时间片原则、优先权原则、短作业优先权原则等。</p>
<ol start="4">
<li>在选择调度方式和调度算法时，应遵循的准则是什么？</li>
</ol>
<p>面向用户的准则：周转时间短、响应时间快、截止时间的保证、优先权准则。<br>面向系统的准则：系统吞吐量高、处理机利用率好、各类资源的平衡利用。</p>
<ol start="5">
<li>何谓静态和动态优先级？确定静态优先级的依据是什么？</li>
</ol>
<p>静态优先级是指在创建进程时确定且在进程的整个运行期间保持不变的优先级。<br>动态优先级是指在创建进程时赋予的优先权， 可以随进程推进或随其等待时间增加而改变的优先级，可以获得更好的调度性能。 <br>确定进程优先级的依据：进程类型、进程对资源的需求和用户要求。</p>
<ol start="6">
<li>试比较 FCFS 和 SPF 两种进程调度算法。</li>
</ol>
<p>相同点：两种调度算法都可以用于作业调度和进程调度。 <br>不同点： <br>FCFS  调度算法每次都从后备队列中选择一个或多个最先进入该队列的作业， 将它们调入内存、分配资源、创建进程、插入到就绪队列。该算法有利于长作业 /进程，不利于短作业 /进程。 <br>SPF 算法每次调度都从后备队列中选择一个或若干个估计运行时间最短的作 业，调入内存中运行。该算法有利于短作业 /进程，不利于长作业 /进程。</p>
<ol start="7">
<li>在时间片轮转法中，应如何确定时间片的大小？</li>
</ol>
<p>时间片应略大于一次典型的交互需要的时间。 一般应考虑三个因素： 系统对相应时间的要求、就绪队列中进程的数目和系统的处理能力。</p>
<ol start="8">
<li>为什么说传统的几种调度算法都不能算是公平调度算法？</li>
</ol>
<p>传统的几种调度算法，都只能满足单条调度需求,对其他则不满足，如FCFS不利于短作业和IO型作业；SJF则不利于长作业和紧迫作业的运行；PSA不利于优先权低的作业;RR不利于紧迫作业。</p>
<ol start="9">
<li>保证调度算法是如何做到调度的公平性的？</li>
</ol>
<p>保证调度算法是另外一种类型的调度算法，它向用户所做出的保证并不是优先运行，而是明确的性能保证，该算法可以做到调度的公平性。<br>一种比较容易实现的性能保证是处理机分配的公平性。如果在系统中有n个相同类型的进程同时运行，为公平起见，须保证每个进程都获得相同的处理机时间1/n。</p>
<ol start="10">
<li>按调度方式可将实时调度算法分为哪几种？</li>
</ol>
<p>按实时任务性质，可将实时调度的算法分为硬实时调度算法和软实时调度算法。</p>
<p>按调度方式不同，可分为非抢占调度算法和抢占调度算法两种。</p>
<ol start="11">
<li>什么是最早截止时间优先调度算法？举例说明。</li>
</ol>
<p>根据任务的开始截止时间确定的任务优先级调度算法。 截止时间越早则优先级越高。 该算法要求在系统中保持一个实时任务就绪队列，该队列按各任务截止时间的先后排序。 举例：非抢占式调度方式用于非周期实时任务。</p>
<ol start="12">
<li>什么是最低松弛度优先调度算法？举例说明之</li>
</ol>
<p>该算法是根据任务紧急 ( 或松弛 )的程度，来确定任务的优先级。任务的紧急程度愈高， 为该任务所赋予的优先级就愈高，以使之优先执行。例如，一个任务在   200 ms 时必须完成，而它本身所需的运行时间就有 100 ms ，因此，调度程序必须在 100 ms 之前调度执行，该任务的紧急程度 (松弛程度 )为 100 ms 。又如，另一任务在 400 ms 时必须完成，它本身需要运行 150 ms ，则其松弛程度为 250 ms 。</p>
<ol start="13">
<li>何谓“优先级倒置”现象，可采用什么方法来解决？</li>
</ol>
<p>优先级倒置，高优先级进程被低优先级进程延迟或阻塞的现象。 解决方法可以是</p>
<p>(1) 规定进程在进入临界区后，其所占有的处理机不允许被抢占。</p>
<p>(2) 动态优先级继承</p>
<ol start="14">
<li>试举例说明竞争不可抢占资源所引起的死锁</li>
</ol>
<p>例如，系统中有两个进程P1和P2，它们都准备写两个文件F1和F2，而这两者都属于可重用和不可抢占性资源。进程P1先打开F1，然后再打开文件F2；进程P2先打开文件F2，后打开F1，下面示出了这段代码。</p>
<figure class="highlight reasonml"><div class="table-container"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">    　　P1</span><br><span class="line"></span><br><span class="line">   　　 P2</span><br><span class="line"></span><br><span class="line">  　　 .........</span><br><span class="line"></span><br><span class="line">   　　<span class="constructor">Open(<span class="params">f1</span>,<span class="params">w</span>)</span>；　　　　 <span class="constructor">Open(<span class="params">f2</span>,<span class="params">w</span>)</span>；</span><br><span class="line"></span><br><span class="line">    　　<span class="constructor">Open(<span class="params">f2</span>,<span class="params">w</span>)</span>；　　　　  <span class="constructor">Open(<span class="params">f1</span>,<span class="params">w</span>)</span>；</span><br></pre></td></tr></table></div></figure>
<p>　　 两个进程P1和P2在并发执行时，如果P1先打开F1和F2，然后P2才去打开F1（或F2），由于文件F1（F2)已被P1打开，故P2会被阻塞。当P1写完文件F1（或F2）而关闭F1（F2)时，P2会由阻塞状态转为就绪状态，被调度执行后重新打开文件F1（或F2)。</p>
<p>　　在这种情况下，P1和P2都能正常运行下去。若P2先打开F1和F2，然后P1才去打开F1（或F2），P1和P2同样也可以正常运行下去。</p>
<p>   但如果在Pl打开F1的同时，P2去打开F2，每个进程都占有一个打开的文件，此时就可能出现问题。因为当P1试图去打开F2，而P2试图去打开F1时，</p>
<p>　　这两个进程都会因文件已被打开而阻塞，它们希望对方关闭自己所需要的文件，但谁也无法运行，因此这两个进程将会无限期地等待下去，而形成死锁。</p>
<ol start="15">
<li>为了破坏“请求和保持”条件而提出了两种协议，试比较这两种协议</li>
</ol>
<p>第一种协议：所有进程在开始运行之前，必须一次性地申请其在整个运行过程中所需的全部资源。优点就是简单、易行且安全；缺点就是资源被严重浪费、进程经常发生饥饿现象。<br>第二种协议：允许一个进程只获得运行初期所需的资源后，便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源，然后再请求新的所需资源。</p>
<ol start="16">
<li>何谓死锁？产生死锁的原因和必要条件是什么?</li>
</ol>
<p>死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局，当进程处于这种僵持状态时，若无外力作用，它们都将无法再向前推进。<br>产生死锁的原因为竞争资源和进程间推进顺序非法。其必要条件是：互斥条件、请求和保持条件、不剥夺条件、环路等待条件。</p>
<ol start="17">
<li>请详细说明可通过哪些途径预防死锁。</li>
</ol>
<p>(1)摈弃“请求和保持”条件,就是如果系统有足够资源,便一次性把进程需要的所有资源分配给它; <br>(2)摈弃“不剥夺”条件,就是已经拥有资源的进程,当它提出新资源请求而不能立即满足时,必须释放它已保持的所有资源,待以后需要时再重新申请;<br>(3)摈弃“环路等待”条件,就是将所有资源按类型排序标号,所有进程对资源的请求必须严格按序号递增的次序提出</p>
<ol start="18">
<li>练习题，P128，T30</li>
<li>练习题，P128，T31</li>
</ol>

        <h2 id="第四章-存储器管理"   >
          <a href="#第四章-存储器管理" class="heading-link"><i class="fas fa-link"></i></a>第四章 存储器管理</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li>为什么要配置层次式存储器？</li>
</ol>
<p>设置多个存储器可以使存储器两端的硬件能并行工作；采用多级存储系统，特别是 Cache 技术，是减轻存储器带宽对系统性能影响的最佳结构方案；在微处理机内部设置各 种缓冲存储器，减轻对存储器存取的压力。增加CPU中寄存器数量大大缓解对存储器压力。</p>
<ol start="2">
<li>何谓静态链接？何谓装入时动态链接和运行时的动态链接？P120</li>
</ol>
<p>静态链接是指在程序运行前，先将各目标模块及它们所需的库函数，链接成一个完整的装配模块，以后不再拆开的链接方式。 </p>
<ol start="3">
<li><p>何谓装入时动态链接？有何优点？</p>
<p>装入时动态链接是指将用户源程序编译后得到的一组目标模块，在装入内存时采用边装入边链接的链接方式。</p>
<p>1.便于修改和更新</p>
<p>2.便于实现对目标模块的共享</p>
</li>
<li><p>何谓运行时动态链接？有何优点？</p>
<p>运行时动态链接是指对某些目标模块的链接，是在程序执行中需要该目标模块时，才对它进行的链接。</p>
<p>1.加快了程序的装入过程，节省大量的内存空间</p>
</li>
<li><p>为什么要引入动态重定位？如何实现？ </p>
</li>
</ol>
<p>在程序执行过程中，每当访问指令或数据时，将要访问的程序或数据的逻辑地址转换成 物理地址，引入了动态重定位； 具体实现方法是在系统中增加一个重定位寄存器，用来装入程序在内存中的起始地址， 程序执行时，真正访问的内存地址是相对地址与重定位寄存器中的地址相加之和，从而实现  动态重定位</p>
<ol start="6">
<li>在采用首次适应算法回收内存时，可能出现哪几种情况？应怎样处理这些情况？ </li>
</ol>
<p>在采用首次适应算法回收内存时可能出现4种情况： （1）回收区前邻空闲区。将回收区与前邻空闲区合并，将前邻空闲区大小修改为两者之和。 <br>（2）回收区后邻空闲区。将两区合并，改后邻空闲区始址为回收区始址，大小为两者之和。 <br>（3）回收区前后均邻空闲区。将三个分区合并，修改前邻空闲区大小为三者之和。 <br>（4）回收区前后均不邻空闲区。为回收区设置空闲区表项，填入回收区始址和大小并插入 空闲区队列。</p>
<ol start="7">
<li><p>什么是基于索引搜索的动态分区匹配算法？它可分为哪几种？<br>（1）快速适应算法<br>优点：查找效率高<br>缺点：为了有效合并分区，分区归主存时的算法复杂，系统开销大。<br>（2）伙伴系统<br>（3）哈希算法</p>
</li>
<li><p>练习题，P162，T11</p>
</li>
<li><p>对文件区管理的目标和对对换空间管理的目标有何不同？<br>对文件区管理的主要目标是提高文件储存空间的利用率，其次才是提高对文件的访问速度。因此对文件区管理采取离散分配方式<br>对对换空间管理的主要目标是提高进程换入换出的速度，其次才是提高文件储存空间的利用率。因此对对换空间的管理采取连续分配方式</p>
</li>
<li><p>在以进程为单位进行对换时，每次是否都将整个进程换出？为什么？<br>在以进程为单位进行对换时，并非每次都将整个进程换出。这是因为： <br>(1)从结构上讲，进程由程序段、数据段和进程控制块组成的，其中进程控制块总有部分或全部常驻内存，不被换出。 <br>(2)程序段和数据段可能正被若干进程共享，此时它们也不能换出</p>
</li>
<li><p>什么是页面？什么是物理块？页面的大小应如何确定？<br>页面：用户程序的地址空间分为若干个固定大小的区域<br>物理块：内存的物理地址空间分为若干个块称为物理块<br>页面大小为2的冥，通常为1KB-8KB</p>
</li>
<li><p>为实现分页存储管理，需要哪些硬件的支持？ <br>页表寄存器<br>动态重定位技术、虚拟存储技术、多道程序设计技术</p>
</li>
<li><p>在具有快表的页式存储管理方式中，如何实现地址变换？</p>
<p>在CPU给出有效地址后，由地址变换机构自动将页号P送入高速缓冲寄存器，并将此 页号与高速缓存中的所有页号比较，若找到匹配页号，表示要访问的页表项在快表中。可直 接从快表读出该页对应物理块号，送到物理地址寄存器中。如快表中没有对应页表项，则再 访问内存页表，找到后，把从页表项中读出物理块号送地址寄存器；同时修改快表，将此页 表项存入快表。但若寄存器已满，则OS必须找到合适的页表项换出。</p>
</li>
<li><p>分页和分段存储管理有何区别？<br>（1）分页存储管理中，页是信息的物理单位。其目标是实现离散分配方式，消灭内存的碎片，提高内存利用率。分段储存管理中，段是信息的逻辑单位。其目标是更好地满足用户得需要。<br>（2）页的大小固定且由系统决定。段的长度不固定，决定于用户所编写的程序。<br>（3）分页是系统的行为。分页的用户程序地址空间是一维的。而分段是用户的行为，用户得地址空间是二位的。</p>
</li>
<li><p>试全面比较连续分配和离散分配方式。</p>
<p>​    连续分配是指为一个用户程序分配一个连续的内存空间。又可进一步分为单一连续分配、固定分区分配、动态分区分配和动态重定位分区分配四种方式。连续分区方式可使一个进程分得一个连续的内存空间，这样一来有利于程序的执行，但同时又会产生很多的碎片，浪费大量的系统资源。</p>
<p>​    离散分区是采用段式或页式或段页式的分配方式将一个进程装入一些离散的内存中，这样有利于内存的利用，并且可以方便程序员在更大的空间进行编程工作。</p>
</li>
</ol>

        <h2 id="第五章-虚拟存储器"   >
          <a href="#第五章-虚拟存储器" class="heading-link"><i class="fas fa-link"></i></a>第五章 虚拟存储器</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li><p>常规存储器管理方式具有哪两大特征？它对系统性能有何影响？</p>
<p>（1）一次性</p>
<p>导致大作业无法在小内存运行，以及无法进一提高系统的多道程序度，直接限制了对处理机的利用率和系统的吞吐量的提高</p>
<p>（2）驻留性</p>
<p>部分进程或者模块长期驻留内存，占用内存资源</p>
</li>
<li><p>什么是程序运行时的时间局限性和空间局限性？</p>
<p>时间局限性：如果程序中的某条指令被执行，则不久后该指令可能再次执行；如果程序中的某数据被访问过，则不久后该数据可能被再次访问。</p>
<p>空间局限性：程序在一段时间内所访问的地址可能集中在一定的范围内</p>
</li>
<li><p>实现虚拟存储器需要哪些硬件支持？</p>
</li>
</ol>
<p>（1）请求分页（段）的页（段）表机制（2）缺页（段）中断机构（3）地址变换机构</p>
<ol start="4">
<li>在请求分页系统中，页表应包括哪些数据项？每项的作用是什么？ </li>
</ol>
<p>页表应包括：页号、物理块号、状态位P、访问字段A、修改位M和外存地址。 其中状态位P 指示该页是否调入内存，供程序访问时参考；访问字段A 用于记录本页在一 段时间内被访问的次数，或最近已有多长时间未被访问，提供给置换算法选择换出页面时参 考；修改位M 表示该页在调入内存后是否被修改过；外存地址用于指出该页在外存上的地 址，通常是物理块号，供调入该页时使用。</p>
<ol start="5">
<li><p>试比较缺页中断机构与一般中断机构，他们之前有何明显的区别？</p>
<p>（1）在指令期间产生和处理中断信号。</p>
<p>（2）一条指令在执行期间可能产生多次缺页中断</p>
</li>
<li><p>试说明请求分页系统中的地址变换功过程。</p>
<p>1）取逻辑地址分解为页号P和页内偏移w；<br>2）根据页号查找页表，获得该页的描述信息；<br>3）若该页中断位为1，产生缺页中断；<br>4）更新该页的描述信息；<br>5) 根据页块号和页内偏移w，计算物理地址。</p>
</li>
<li><p>在请求分页系统中，应从何处将所需页面调入内存？ </p>
</li>
</ol>
<p>请求分页系统中的缺页从何处调入内存分三种情况： </p>
<p>（1）系统拥有足够对换区空间时，可以全部从对换区调入所需页面，提高调页速度。在进程运行前将与该进程有关的文件从文件区拷贝到对换区。 <br>（2）系统缺少足够对换区空间时，不被修改的文件直接从文件区调入；当换出这些页面时，未被修改的不必换出，再调入时，仍从文件区直接调入。对于可能修改的，在换出时便调到对换区，以后需要时再从对换区调入。<br>（3）UNIX 方式。未运行页面从文件区调入。曾经运行过但被换出页面，下次从对换区调入。UNIX系统允许页面共享，某进程请求的页面有可能已调入内存，直接使用不再调入。</p>
<ol start="8">
<li><strong>在请求分页系统中，常采用哪几种页面置换算法？</strong></li>
</ol>
<p>采用的页面置换算法有：最佳置换算法和先进先出置换算法，最近最久未使用（LRU）置换算法，Clock置换算法，最少使用置换算法，页面缓冲算法等</p>
<ol start="9">
<li>实现LRU算法所需的硬件支持是什么?</li>
</ol>
<p>需要寄存器和栈等硬件支持。寄存器用于记录某进程在内存中各页的使用情况，栈用于 保存当前使用的各个页面的页面号。</p>
<ol start="10">
<li>试说明改进型 Clock 置换算法的基本原理. </li>
</ol>
<p>因为修改过的页面在换出时付出的开销比未被修改过的页面大，在改进型Clock 算法 中，既考虑页面的使用情况，还要增加置换代价的因素；在选择页面作为淘汰页面时，把同 时满足未使用过和未被修改作为首选淘汰页面。 </p>
<ol start="11">
<li><p>影响页面换进换出频率的若干因素是什么？</p>
<p>对页面进行置换的算法，将已修改页面写回磁盘的频率，将磁盘内容读入内存的频率</p>
</li>
<li><p>页面缓冲算法（PBA）的主要特点是什么？它是如何实现的</p>
<p>（1）显著地降低了页面换进换出地频率，使磁盘IO操作次数大为减少。</p>
<p>（2）采用一种较简单的置换策略</p>
<p>实现：采用可变分配和局部置换方式，系统为每个进程分配一定数目的物理块，自己保留一部分空闲物理块，同时在内存中设置空闲页面链表和修改页面链表。</p>
</li>
<li><p><strong>在请求分页系统汇总，产生“抖动”的原因是什么？</strong></p>
<p><strong>系统中同时运行的进程太多，每个进程分配的物理块太少，不能满足进程运行的基本要求，导致进程运行频繁缺页，必须访问将缺页调入内存。</strong></p>
</li>
<li><p>何谓工作集？它是基于什么原理确定的？</p>
<p>某段时间间隔里，进程实际要访问页面的集合。</p>
<p>原理：预知程序在某段时间间隔内要访问的页面，将他们调入内存，降低缺页率。</p>
</li>
<li><p>当前可以利用哪几种方式来防止“抖动”？</p>
<p>1.采取局部置换策略</p>
<p>2.把工集算法融入到处理机调度中</p>
<p>3.利用“L=S”准确调节缺页率</p>
<p>4.选择暂停的进程</p>
</li>
</ol>

        <h2 id="第六章-输入输出系统"   >
          <a href="#第六章-输入输出系统" class="heading-link"><i class="fas fa-link"></i></a>第六章 输入输出系统</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li><p>试说明IO系统的基本功能</p>
<p>  1.方便用户使用IO设备</p>
<p>  2.提高CPU和IO设备的利用率</p>
<p>  3.为用户在共享设备时提供方便</p>
</li>
<li><p>简要说明IO软件的四个层次的基本功能</p>
<p>  用户层IO软件，实现用户交互的接口</p>
<p>  设备独立性软件，用于实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配</p>
<p>  和释放等，同时为设备管理和数据传送提供必要的储存空间</p>
<p>  设备驱动程序，与硬件直接相关，用于具体实现系统对设备发出的操作指令、驱动IO设备工作的驱动程序</p>
<p>  中断处理程序，用于保存被中断进程的cpu环境，转入相应的中断处理程序进行处理，处理完毕再恢复被</p>
<p>  中断进程的现场后哦，返回被中断的进程</p>
</li>
<li><p>IO系统接口与软件/硬件接口分别是什么接口</p>
<p>  IO系统接口时IO系统与上层操作系统之间的接口。</p>
<p>  软件/硬件接口是中断处理程序和设备控制器之间的接口</p>
</li>
<li><p>与设备无关性的基本含义是什么，为什么要设置该层</p>
<p>  应用程序独立于具体使用的物理设备，为了提高OS的可适应性和可拓展性</p>
</li>
<li><p>为了实现cpu与设备控制器间的通信，设备控制器应该具备哪些功能</p>
<p>  （1）接受和识别命令</p>
<p>  （2）数据交换</p>
<p>  （3）标识和报告设备的状态</p>
<p>  （4）地址识别</p>
<p>  （5）数据缓冲区</p>
<p>  （6）差错控制</p>
</li>
<li><p>什么是内存映像IO？他是如何实现的</p>
<p>  1.利用特定的IO指令  </p>
<p>  缺点：访问内存和访问设备需要两种不同的指令</p>
<p>  2.内存映像IO</p>
<p>  在编址上不再区分内存单元地址和设备控制器中的寄存器地址，采用k。k属于0—n-1时，被认为时内存地址，大于等于n时，被认为是某个控制器的寄存器地址</p>
</li>
<li><p>为什么说中断是os赖以生存的基础</p>
<p>  进程的切换是通过中断完成的，中断也是设备管理的基础</p>
</li>
<li><p>设备中断处理程序通常需要完成哪些工作</p>
<ol>
<li>测定是否有未响应的中断信号</li>
<li>保护被终端进程的cpu环境</li>
<li>转入相应的设备处理程序</li>
<li>中断处理</li>
<li>恢复cpu的现场并退出中断</li>
</ol>
</li>
<li><p>简要说明中断处理程序对中断进行处理的几个步骤</p>
<p>①关中断，进入不可再次响应中断的状态，由硬件实现。<br>②保存断点，为了在中断处理结束后能正确返回到中断点。由硬件实现。<br>  ③将中断服务程序入口地址送PC，转向中断服务程序。可由硬件实现，也可由软件实现。<br>④保护现场、置屏蔽字、开中断，即保护CPU中某些寄存器的内容、设置中断处理次序、允许更高级的中断请求得到响应，实现中断嵌套。由软件实现。<br>  ⑤设备服务，实际上有效的中断处理工作是在此程序段中实现的。</p>
<p>  ⑥退出中断。</p>
</li>
<li><p>试说明推动IO控制发展的主要因素是什么</p>
<p>  尽量减少主机对IO控制的干预，把主机从繁杂的IO控制事务中解脱</p>
</li>
<li><p>有哪几种IO控制方式，分别适用于何种场合</p>
<p>  I/O控制方式：程序I/O方式、中断驱动I/O控制方式、DMAI/O控制方式、I/O通道控制方式。</p>
<p>  程序I/O方式适用于早期的计算机系统中，并且是无中断的计算机系统；</p>
<p>  中断驱动I/O控制方式是普遍用于现代的计算机系统中；</p>
<p>  DMA  I/O控制方式适用于I/O设备为块设备时在和主机进行数据交换的一种I/O控制方式；</p>
<p>  当I/O设备和主机进行数据交换是一组数据块时通常采用I/O通道控制方式，但此时要求系统必须配置相应的通道及通道控制器。</p>
</li>
<li><p>试说明DMA的工作流程</p>
<p>  （1）CPU需要访问外存时便发送。一条访问命令给DMA的命令寄存器CR、一个内存地址码给DMA的内存地址寄存器MAR、本次要传送的字节数给DMA的数据计数器DC、外存地址给DMA的I/O控制逻辑。</p>
<p>  （2）CPU启动DMA控制器后转向其他处理。</p>
<p>  （3）DMA控制器负责控制数据在内存与外设之间传送。每传送一个字节就需挪用一个内存周期，按MAR从内存读出或写入内存一个字节，修改MAR和计算器DC。</p>
<p>  （4）当DC修改为0时，表示传送结束，由DMA向CPU发出中断请求。</p>
</li>
<li><p>为何要引入与设备的无关性，如何实现设备的独立性</p>
<p>引入设备独立性，可使应用程序独立于具体的物理设备，是设备分配具有灵活性。另外容易实现I/0重定向。为了实现设备独立性，必须在设备驱动程序之上设置一层设备独立性软件，用来执行所有I/0设备的公用操作，并向用户层软件提供统一接口。</p>
<p>关键是系统中必须设置一张逻辑设备表LUT用来进行逻辑设备到物理设备的映射，其中每个表目中包含了逻辑设备名、物理设备名和设备驱动程序入口地址三项；</p>
<p>当应用程序用逻辑设备名请求分配I/0设备时，系统必须为它分配相应的物理设备，并在LUT中建立一个表目，以后进程利用该逻辑设备名请求I/0操作时，便可从LUT中得到物理设备名和驱动程序入口地址。</p>
</li>
<li><p>何为设备虚拟，实现设备虚拟时所依赖的关键技术是什么</p>
</li>
<li><p>引入缓冲的主要原因是什么</p>
<ol>
<li>缓和cpu与io设备间速度不匹配的矛盾</li>
<li>减少对cpu的中断频率，放宽对cpu中断响应时间的限制</li>
<li>解决数据粒度不匹配的问题</li>
<li>提高cpu和io设备之间的并行性</li>
</ol>
</li>
<li><p>在单缓冲情况下，为什么系统对一块数据的处理时间为max(C，T）+M</p>
</li>
<li><p>为什么双缓冲情况下系统对一块数据的处理时间为max(C，T）</p>
</li>
<li><p>目前常用的磁盘调度算法有哪几种，每种算法优先考虑的问题是什么</p>
<ol>
<li><p>先来先服务(FCFS)</p>
<p>根据进程请求访问次磁盘的先后次序进行调度</p>
</li>
<li><p>最短寻道时间优先(SSTF)</p>
<p>要求访问的磁道与当前磁头所在的磁道距离最近</p>
</li>
<li><p>扫描算法(SCAN)</p>
<p>优先考虑磁头当前的移动方向，再考虑欲访问的磁道与当前磁道的距离</p>
</li>
<li><p>循环扫描算法(CSCAN)</p>
<p>CSCAN算法规定磁头单向移动，避免了扫描算法导致的某些进程磁盘请求的严重延迟。</p>
</li>
<li><p>NStepSCAN算法</p>
<p> 为克服前述SSTF、SCAN、CSCAN等调度算法都可能出现的磁臂停留在某处不动的情况即磁臂粘着现象，将磁盘请求队列分成若干个长度为N的子队列，按先来先服务算法依次处理这些子队列，而各队列分别以扫描算法进行处理。</p>
</li>
<li><p>FSCAN算法</p>
<p>它只将磁盘请求访问队列分成两个子队列。一是当前所有请求磁盘I/O的进程形成的队列，由磁盘调度按SCAN算法进行处理。另一个队列则是在 扫描期间，新出现的所有请求磁盘I/O进程的队列，放入另一等待处理的请求队列。这样，所有的新请求都将被推迟到下一次扫描时处理。</p>
</li>
</ol>
</li>
</ol>

        <h2 id="第七章-文件管理"   >
          <a href="#第七章-文件管理" class="heading-link"><i class="fas fa-link"></i></a>第七章 文件管理</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li><p>何谓文件的逻辑结构，何谓文件的物理结构</p>
<p>  逻辑结构：文件是由一系列的逻辑记录组成的，是用户可以直接处理的数据及其结构。</p>
<p>  物理结构：系统将文件储存在外存上所形成的一种构成形式</p>
</li>
<li><p>按文件的组织方式可将文件分为几种类型</p>
<ol>
<li>顺序文件</li>
<li>索引文件</li>
<li>索引顺序文件</li>
</ol>
</li>
<li><p>通过哪两种方式来固定长记录实现随机访问</p>
<ol>
<li>隐式寻址方式</li>
<li>显式寻址方式</li>
</ol>
</li>
<li><p>对目录管理的主要要求是什么</p>
<ol>
<li>实现“按名存取”。用户只需向系统提供所需访问文件的名字，就能快速准确地找到指定文件在外存上地储存位置</li>
<li>提高对目录的检索速度</li>
<li>文件共享</li>
<li>允许文件重名</li>
</ol>
</li>
<li><p>何谓路径名和当前目录</p>
<p>  路径名：从根目录到任何数据文件都只有一条唯一的路。从主目录开始，把全部目录文件名与数据文件名依次用“/”连</p>
<p>  接起来，构成该数据文件唯一的路径名</p>
<p>  当前目录：当前用户所在的路径（不太确定）</p>
</li>
<li><p>Hash检索法有何优点，又有何局限性</p>
<p>  优点：将用户提供的文件名转换为文件目录的索引值，再使用索引值到目录中寻找。能显著提升检索速度</p>
<p>  局限：对于使用了通配符的文件名，无法使用Hash检索法转换文件名，只能使用线性检索法</p>
</li>
<li><p>试说明在树形目录结构中线性检索法的检索过程，并给出相应的流程图</p>
<p>  Level2/„/Leveln/datafile，则关于树型目录结构采用线性检索法检索该文件的基本过程为：</p>
<p>  ①读入第一个文件分量名Level1，用它与根目录文件（或当前目录文件）中各个目录项的文件名顺序地进行比较，从中找出匹配者，并得到匹配项的索引结点号，再从对应索引结点中获知Level1目录文件所在的盘块号，将相应盘块读入内存。</p>
<p>  ②对于2~n，循环执行以下步骤，以检索各级目录文件：读入第i个文件分量名Leveli，用它与最新调入内存的当前目录文件中各个目录项的文件名顺序地进行比较，从中找出匹配者，并得到匹配项的索引结点号，再从对应索引结点中获知Leveli目录文件所在的盘块号，将相应盘块读入内存。<br>  ③读入最后一个文件分量名即datafile，用它与第n级目录文件中各个目录项的文件名进行比较，从而得到该文件对应的索引结点号，进而找到该文件物理地址，目录查找操作成功结束。如果在上述查找过程中，发现任何一个文件分量名未能找到，则停止查找并返回“文件未找到”的出错信息</p>
</li>
<li><p>什么是主父目录，如何利用符号链实现共享</p>
<p>  允许一个文件或者子目录有多个父目录，但是其中只有一个作为主父目录。</p>
<p>  例如目录D想共享某个文件，系统创建一个LINK类型的新文件，该新文件只包含要链接的文件的路名名。将该新文件写入想要目录D中</p>
</li>
<li><p>基于符号链的文件共享方式有何优点</p>
<p>  只有文件主才有指向其索引结点的指针，共享该文件的其他用户只有路径名。在文件主删除文件时，不会留下悬空指针。其他用户通过符号链访问已删除的共享文件时，会因为找不到指针而访问失败，然后删除符号链，这样不会产生任何影响。（感觉像快捷方式）</p>
</li>
<li><p>什么是保护域，进程和保护域之间存在的动态联系是什么</p>
<p>  保护域简称为“域”，他是进程对一组对象访问权的集合，进程只能在制定域内执行操作。</p>
<p>  动态联系：一个进程连续着多个域。进程运行分为多个阶段，每个阶段联系着一个域。在运行时根据实习需要来规定进程运行的</p>
<p>  每个阶段中能访问的对象</p>
</li>
</ol>

        <h2 id="第八章-磁盘存储器的管理"   >
          <a href="#第八章-磁盘存储器的管理" class="heading-link"><i class="fas fa-link"></i></a>第八章 磁盘存储器的管理</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li><p>目前常用的外存有哪几种组织方式</p>
<ol>
<li>连续组织方式</li>
<li>链接组织方式</li>
<li>索引组织方式</li>
</ol>
</li>
<li><p>由连续组织方式所形成的顺序文件的主要优缺点时什么，主要应用于何种场合</p>
<p>  （1）连续组织方式所形成的顺序文件的主要优点</p>
<p>  ①顺序访问容易</p>
<p>  访问连续文件非常容易，系统可从目录中找到该顺序文件所在的第一个盘块号，从此开始逐个盘块地往下读，写。连续分配也支持对定长记录的文件进行随机存取。</p>
<p>  ②顺序访问速度快</p>
<p>  由连续分配所装入的文件，其所占用的盘块可能是位于一条或几条相邻的磁道上，磁头的移动距离最少，因此，这种对文件访问的速度是几种存储空间分配方式中最高的一种。</p>
<p>  （2）连续组织方式所形成的顺序文件的主要缺点</p>
<p>  ①要求为一个文件分配连续的存储空间</p>
<p>  由内存的连续分配得知，这样便会产生出许多外部碎片，严重地降低了外存空间的利用率。如果是定期地利用紧凑方法来消除碎片，则又需花费大量的机器时间。</p>
<p>  ②必须事先知道文件的长度</p>
<p>  要将一个文件装入一个连续的存储区中，必须事先知道文件的大小。知道文件的大小有时只能靠估算，如果估计的文件大小比实际文件小，就会因存储空间不足而中止文件的拷贝，要求用户重新估算后再次拷贝。这就促使用户将文件长度估得比实际的大，从而造成浪费。</p>
<p>  ③不能灵活地删除和插入记录</p>
<p>  为保持文件的有序性，在删除和插入记录时，都需要对相邻的记录做物理上的移动，还会动态地改变文件的大小。</p>
<p>  ④对于那些动态增长的文件，由于事先很难知道文件的最终大小，因而很难为其分配空间，而即使事先知道文件的最终大小，在采用预分配存储空间的方法时，也会使大量的存储空间长期空闲。</p>
<p>  （3）主要适用场合</p>
<p>  连续组织方式所形成的顺序文件是一种最简单、最常用的文件组织方法，它适用于许多资料处理的场合，如磁带文件，打印文件都是常用的顺序文件。</p>
</li>
<li><p>在链接式文件中常用哪种链接方式，为什么</p>
<p>  常使用显式链接，隐式链接组织方式只适合顺序访问，随机访问的速度很低。而且隐式链接组织方式只通过链接指针将离散的盘块链接起来，可靠性较差。而显式链接查找记录的过程式在内存中进行的，显著地提高了检索速度和减少了访问磁盘的次数。</p>
</li>
<li><p>简要说明为什么要从FAT12发展为FAT16,又进一步发展为FAT32</p>
<p>  FAT12存在主要问题：FAT12表中的表项有限制，最多只允许4096个。因此，随着磁盘的增加，簇的大小和簇内碎片也随之增加。限制了磁盘的最大容量。同时FAT12只能支持短文件名。为了解决FAT12限制磁盘容量的问题，FAT的表项位数增至2的16次方个。发展为FAT16，但是磁盘容量迅速增加时，簇的容量必须很大，簇内碎片造成的浪费也很大。因此FAT进一步发展为FAT32</p>
</li>
<li><p>P297   T11 </p>
</li>
<li><p>P297   T14</p>
</li>
</ol>

        <h2 id="第九章-操作系统接口"   >
          <a href="#第九章-操作系统接口" class="heading-link"><i class="fas fa-link"></i></a>第九章 操作系统接口</h2>
      <ul>
<li><input checked="" disabled="" type="checkbox"> 完成</li>
</ul>
<ol>
<li>操作系统用户接口中包括哪几种接口？他们分别适用于哪种情况</li>
</ol>
<p>操作系统包括四种类型的用户接口：命令接口（分为联机与脱机命令接口）、程序接口、图形化用户接口和网络用户接口。<br>命令接口和图形化用户接口支持用户直接通过终端来使用计算机系统，程序接口提供给用户在编制程序时使用，网络用户接口是面向网络应用的接口。</p>
<ol start="2">
<li>联机命令通常包含哪些类型？每种类型又包含哪些主要命令？</li>
</ol>
<p>联机命令通常包含如下类型：<br>（1 ）系统访问类，主要是注册命令login 、password ；（2 ）磁盘操作类，包括磁盘格式化format 、软盘复制diskcopy 、软盘比较diskcomp 及备份backup 等命令；（3 ）文件操作类，包括文件显示type 、文件拷贝copy 、文件比较comp 、文件重命名rename 、文件删除erase 等命令<br>（4 ）目录操作类，包括子目录建立mkdir 、目录显示dir 、子目录删除rmdir 、目录结构显示tree 、当前目录改变chdir 等命令；（5 ）其它命令，包括输入输出重定向&gt;、&lt;, 管道联接|、过滤命令/,批命令.bat 等。</p>
<ol start="3">
<li>什么是输入输出重定向？试举例说明。</li>
</ol>
<p>命令的输入通常取自标准输入设备键盘，命令输出则送往标准输出设备显示终端。如果在命令中设置输出定向“&gt;，”其后接文件或设备名，则命令的结果输出将送到指定文件或设备上；如果使用输入重定向“&lt;，”则不从键盘而是从重定向符右边的指定文件或设备上取得输入信息。这就是输入输出的重定向。</p>
<ol start="4">
<li>何谓管道联接？试举例说明。</li>
</ol>
<p>管道联接是指把第一个命令的输出作为第二个命令的输入，或把第二个命令的输出作为第三条命令的输入，以此类推，由两条以上的命令可形成一条管道。在MS-DOS 和UNIX 中，都用”|” 作为管道符号。其一般格式为：command1 |command2 | |commandn 。</p>
<ol start="5">
<li>联机命令接口由哪些部分构成？</li>
</ol>
<p>联机命令接口由一组联机命令、终端处理程序和命令解释程序构成。</p>
<ol start="6">
<li>终端设备处理程序的主要作用是什么？它具有哪些功能？</li>
</ol>
<p>主要用于实现人机交互，它具有以下功能：<br>（1）接收用户从终端上键入的字符；<br>（2）字符缓冲，用于暂存接收的字符；<br>（3）回送显示；<br>（4）屏幕编辑；<br>（5）特殊字符处理。</p>

        <h2 id="致谢"   >
          <a href="#致谢" class="heading-link"><i class="fas fa-link"></i></a>致谢</h2>
      <hr>
<p>感谢<span class="exturl"><a class="exturl__link"   href="https://github.com/czhorz"  target="_blank" rel="noopener">@czhorz</a><span class="exturl__icon"><i class="fas fa-external-link-alt"></i></span></span>对本文的支持</p>
</div><footer class="post-footer"><div class="post-ending ending"><div class="ending__text">------ END ------</div></div><div class="post-copyright copyright"><div class="copyright-author"><span class="copyright-author__name">Author: </span><span class="copyright-author__value"><a href="https://mikyming.online">MikyMing</a></span></div><div class="copyright-link"><span class="copyright-link__name">Link: </span><span class="copyright-link__value"><a href="https://mikyming.online/2020/12/26/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E9%87%8D%E7%82%B9%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86/">https://mikyming.online/2020/12/26/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E9%87%8D%E7%82%B9%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86/</a></span></div><div class="copyright-notice"><span class="copyright-notice__name">Copyright: </span><span class="copyright-notice__value">All articles in this blog are licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-cn" rel="external nofollow" target="_blank">BY-NC-SA</a> unless stating additionally</span></div></div><div class="post-tags"><span class="post-tags-item"><span class="post-tags-item__icon"><i class="fas fa-tag"></i></span><a class="post-tags-item__link" href="https://mikyming.online/tags/%E6%8A%80%E6%9C%AF%E6%8E%A2%E7%A9%B6/">技术探究</a></span></div><nav class="post-paginator paginator"><div class="paginator-prev"><a class="paginator-prev__link" href="/2021/01/05/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/"><span class="paginator-prev__icon"><i class="fas fa-angle-left"></i></span><span class="paginator-prev__text">数字图像处理</span></a></div><div class="paginator-next"><a class="paginator-next__link" href="/2020/10/07/%E5%9B%9E%E5%BD%A2%E9%92%88%E4%B8%8E10%E4%B8%AA%E6%89%B9%E8%AF%84%E8%80%85%E8%81%8A%E5%A4%A9/"><span class="paginator-prev__text">回形针与10个批评者聊天</span><span class="paginator-next__icon"><i class="fas fa-angle-right"></i></span></a></div></nav></footer></div></div></div><div class="sidebar-wrap" id="sidebar-wrap"><aside class="sidebar" id="sidebar"><div class="sidebar-nav"><span class="sidebar-nav-toc current">Catalog</span><span class="sidebar-nav-ov">Overview</span></div><section class="sidebar-toc"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#第一章-操作系统引论"><span class="toc-number">1.</span> <span class="toc-text">
          第一章 操作系统引论</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#第二章-进程的描述与控制"><span class="toc-number">2.</span> <span class="toc-text">
          第二章 进程的描述与控制</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#第三章-处理机调度和死锁"><span class="toc-number">3.</span> <span class="toc-text">
          第三章 处理机调度和死锁</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#第四章-存储器管理"><span class="toc-number">4.</span> <span class="toc-text">
          第四章 存储器管理</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#第五章-虚拟存储器"><span class="toc-number">5.</span> <span class="toc-text">
          第五章 虚拟存储器</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#第六章-输入输出系统"><span class="toc-number">6.</span> <span class="toc-text">
          第六章 输入输出系统</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#第七章-文件管理"><span class="toc-number">7.</span> <span class="toc-text">
          第七章 文件管理</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#第八章-磁盘存储器的管理"><span class="toc-number">8.</span> <span class="toc-text">
          第八章 磁盘存储器的管理</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#第九章-操作系统接口"><span class="toc-number">9.</span> <span class="toc-text">
          第九章 操作系统接口</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#致谢"><span class="toc-number">10.</span> <span class="toc-text">
          致谢</span></a></li></ol></section><!-- ov = overview--><section class="sidebar-ov hide"><div class="sidebar-ov-author"><div class="sidebar-ov-author__avatar"><img class="sidebar-ov-author__avatar_img" src="/images/icons/touxiang.jpg" alt="avatar"></div><p class="sidebar-ov-author__text">write code and love life</p></div><div class="sidebar-ov-social"><a class="sidebar-ov-social-item" href="https://github.com/5522mike/" target="_blank" rel="noopener" data-popover="Github" data-popover-pos="up"><span class="sidebar-ov-social-item__icon"><i class="fab fa-github"></i></span></a><a class="sidebar-ov-social-item" href="mailto:wuyyming@gmail.com" target="_blank" rel="noopener" data-popover="social.email" data-popover-pos="up"><span class="sidebar-ov-social-item__icon"><i class="fas fa-envelope"></i></span></a></div><div class="sidebar-ov-feed"><span class="sidebar-ov-feed-rss"><a class="sidebar-ov-feed-rss__link" href="/atom.xml" target="_blank" rel="noopener"><span class="sidebar-ov-feed-rss__icon"><i class="fas fa-rss"></i></span><span>RSS Subscribe</span></a></span></div><div class="sidebar-ov-state"><a class="sidebar-ov-state-item sidebar-ov-state-item--posts" href="/archives/"><div class="sidebar-ov-state-item__count">24</div><div class="sidebar-ov-state-item__name">Archives</div></a><a class="sidebar-ov-state-item sidebar-ov-state-item--categories" href="/categories/"><div class="sidebar-ov-state-item__count">4</div><div class="sidebar-ov-state-item__name">Categories</div></a><a class="sidebar-ov-state-item sidebar-ov-state-item--tags" href="/tags/"><div class="sidebar-ov-state-item__count">6</div><div class="sidebar-ov-state-item__name">Tags</div></a></div><div class="sidebar-ov-cc"><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-cn" target="_blank" rel="noopener" data-popover="Creative Commons" data-popover-pos="up"><img src="/images/cc-by-nc-sa.svg"></a></div></section><div class="sidebar-reading"><div class="sidebar-reading-info"><span class="sidebar-reading-info__text">You have read </span><span class="sidebar-reading-info__num">0</span></div><div class="sidebar-reading-line"></div></div></aside></div><div class="clearfix"></div></div></main><footer class="footer" id="footer"><div class="footer-inner"><div><span>Copyright © 2022</span><span class="footer__icon"><i class="fas fa-heart"></i></span><span>MikyMing</span></div><div><span>Powered by <a href="http://hexo.io/" title="Hexo" target="_blank" rel="noopener">Hexo</a></span><span> v4.0.0</span><span class="footer__devider">|</span><span>Theme - <a href="https://github.com/liuyib/hexo-theme-stun/" title="Stun" target="_blank" rel="noopener">Stun</a></span><span> v2.0.0-rc.0</span></div><div class="busuanzi"><span class="busuanzi-siteuv"><span class="busuanzi-siteuv__icon" data-popover-pos="up" data-popover="Unique Visitor"><i class="fas fa-user"></i></span><span class="busuanzi-siteuv__value" id="busuanzi_value_site_uv"></span></span><span class="busuanzi-sitepv"><span class="busuanzi-siteuv__icon" data-popover-pos="up" data-popover="Page View"><i class="fas fa-eye"></i></span><span class="busuanzi-siteuv__value" id="busuanzi_value_site_pv"></span></span></div></div></footer><div class="loading-bar" id="loading-bar"><div class="loading-bar__progress"></div></div><div class="back2top" id="back2top"><span class="back2top__icon"><i class="fas fa-rocket"></i></span></div></div><div class="search-mask"></div><div class="search-popup"><span class="search-close"></span><div class="search-input"><input placeholder="Search for Posts (Support multiple keywords)"></div><div class="search-results"></div></div><script src="https://cdn.jsdelivr.net/npm/jquery@v3.4.1/dist/jquery.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.2/velocity.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.2/velocity.ui.min.js"></script><script src="https://cdn.jsdelivr.net/npm/ribbon.js@latest/dist/ribbon.min.js" size="120" alpha="0.6" zIndex="-1"></script><script>function initSearch() {
  var isXML = true;
  var search_path = 'search.json';

  if (!search_path) {
    search_path = 'search.xml';
  } else if (/json$/i.test(search_path)) {
    isXML = false;
  }

  var path = '/' + search_path;
  $.ajax({
    url: path,
    dataType: isXML ? 'xml' : 'json',
    async: true,
    success: function (res) {
      var datas = isXML ? $('entry', res).map(function () {
        // 将 XML 转为 JSON
        return {
          title: $('title', this).text(),
          content: $('content', this).text(),
          url: $('url', this).text()
        };
      }).get() : res;
      var $input = $('.search-input input');
      var $result = $('.search-results');
      // 搜索对象（标题、内容）的权重，影响显示顺序
      var WEIGHT = { title: 100, content: 1 };
      var searchPost = function () {
        var searchText = $input.val().toLowerCase().trim();
        // 根据空白字符分隔关键字
        var keywords = searchText.split(/[\s]+/);
        // 搜索结果
        var matchPosts = [];

        // 有多个关键字时，将原文字整个保存下来
        if (keywords.length > 1) {
          keywords.push(searchText);
        }
        // 防止未输入字符时搜索
        if (searchText.length > 0) {
          datas.forEach(function (data) {
            var isMatch  = false;
            // 没有标题的文章使用预设的 i18n 变量代替
            var title = (data.title && data.title.trim()) || '[ Untitled ]';
            var titleLower = title && title.toLowerCase();
            // 删除 HTML 标签 和 所有空白字符
            var content = data.content && data.content.replace(/<[^>]+>/g, '');
            var contentLower = content && content.toLowerCase();
            // 删除重复的 /
            var postURL = data.url && decodeURI(data.url).replace(/\/{2,}/g, '/');
            // 标题中匹配到的关键词
            var titleHitSlice = [];
            // 内容中匹配到的关键词
            var contentHitSlice = [];

            keywords.forEach(function (keyword) {
              /**
              * 获取匹配的关键词的索引
              * @param {String} keyword 要匹配的关键字
              * @param {String} text 原文字
              * @param {Boolean} caseSensitive 是否区分大小写
              * @param {Number} weight 匹配对象的权重。权重大的优先显示
              * @return {Array}
              */
              function getIndexByword (word, text, caseSensitive, weight) {
                if (!word || !text) {
                  return [];
                };

                var startIndex = 0; // 每次匹配的开始索引
                var index = -1;     // 匹配到的索引值
                var result = [];    // 匹配结果

                if (!caseSensitive) {
                  word = word.toLowerCase();
                  text = text.toLowerCase();
                }

                while((index = text.indexOf(word, startIndex)) !== -1) {
                  var hasMatch = false;
                  // 索引位置相同的关键词，保留长度较长的
                  titleHitSlice.forEach(function (hit) {
                    if (hit.index === index && hit.word.length < word.length) {
                      hit.word = word;
                      hasMatch = true;
                    }
                  });
                  startIndex = index + word.length;
                  !hasMatch && result.push({ index: index, word: word, weight: weight });
                }
                return result;
              }
              titleHitSlice = titleHitSlice.concat(getIndexByword(keyword, titleLower, false, WEIGHT.title));
              contentHitSlice = contentHitSlice.concat(getIndexByword(keyword, contentLower, false, WEIGHT.content));
            });

            var hitTitle = titleHitSlice.length;
            var hitContent = contentHitSlice.length;

            if (hitTitle > 0 || hitContent > 0) {
              isMatch = true;
            }
            if (isMatch) {
              ;[titleHitSlice, contentHitSlice].forEach(function (hit) {
                // 按照匹配文字的索引的递增顺序排序
                hit.sort(function (left, right) {
                  return left.index - right.index;
                });
              });
              /**
              * 给文本中匹配到的关键词添加标记，从而进行高亮显示
              * @param {String} text 原文本
              * @param {Array} hitSlice 匹配项的索引信息
              * @param {Number} start 开始索引
              * @param {Number} end 结束索引
              * @return {String}
              */
              function highlightKeyword (text, hitSlice, start, end) {
                if (!text || !hitSlice || !hitSlice.length) {
                  return;
                }

                var result = '';
                var startIndex = start;
                var endIndex = end;
                hitSlice.forEach(function (hit) {
                  if (hit.index < startIndex) {
                    return;
                  }

                  var hitWordEnd = hit.index + hit.word.length;
                  result += text.slice(startIndex, hit.index);
                  result += '<b>' + text.slice(hit.index, hitWordEnd) + '</b>';
                  startIndex = hitWordEnd;
                });
                result += text.slice(startIndex, endIndex);
                return result;
              }

              var postData = {};
              // 文章总的搜索权重
              var postWeight = titleHitSlice.length * WEIGHT.title + contentHitSlice.length * WEIGHT.content;
              // 标记匹配关键词后的标题
              var postTitle = highlightKeyword(title, titleHitSlice, 0, title.length) || title;
              // 标记匹配关键词后的内容
              var postContent;
              // 显示内容的长度
              var SHOW_WORD_LENGTH = 200;
              // 命中关键词前的字符显示长度
              var SHOW_WORD_FRONT_LENGTH = 20;
              var SHOW_WORD_END_LENGTH = SHOW_WORD_LENGTH - SHOW_WORD_FRONT_LENGTH;

              // 截取匹配的第一个字符，前后共 200 个字符来显示
              if (contentHitSlice.length > 0) {
                var firstIndex = contentHitSlice[0].index;
                var start = firstIndex > SHOW_WORD_FRONT_LENGTH ? firstIndex - SHOW_WORD_FRONT_LENGTH : 0;
                var end = firstIndex + SHOW_WORD_END_LENGTH;
                postContent = highlightKeyword(content, contentHitSlice, start, end);
              } else { // 未匹配到内容，直接截取前 200 个字符来显示
                postContent = content.slice(0, SHOW_WORD_LENGTH);
              }
              postData.title = postTitle;
              postData.content = postContent;
              postData.url = postURL;
              postData.weight = postWeight;
              matchPosts.push(postData);
            }
          });
        }

        var resultInnerHtml = '';
        if (matchPosts.length) {
          // 按权重递增的顺序排序，使权重大的优先显示
          matchPosts.sort(function (left, right) {
            return right.weight - left.weight;
          });
          resultInnerHtml += '<ul>';
          matchPosts.forEach(function (post) {
            resultInnerHtml += '<li><a class="search-results-title" href="' + post.url + '">';
            resultInnerHtml += post.title;
            resultInnerHtml += '</a><div class="search-results-content">';
            resultInnerHtml += post.content;
            resultInnerHtml += '</div></li>';
          });
          resultInnerHtml += '</ul>';
        } else {
          resultInnerHtml += '<div class="search-results-none"><i class="far fa-meh"></i></div>';
        }
        $result.html(resultInnerHtml);
      };
      $input.on('input', searchPost);
      $input.on('keyup', function (e) {
        if (e.keyCode === Stun.utils.codeToKeyCode('Enter')) {
          searchPost();
        }
      });
    }
  });
}

function closeSearch () {
  $('body').css({ overflow: 'auto' });
  $('.search-popup').css({ display: 'none' });
  $('.search-mask').css({ display: 'none' });
}

window.addEventListener('DOMContentLoaded', function () {
  Stun.utils.pjaxReloadLocalSearch = function () {
    $('.header-nav-search').on('click', function (e) {
      e.stopPropagation();
      $('body').css('overflow', 'hidden');
      $('.search-popup')
        .velocity('stop')
        .velocity('transition.expandIn', {
          duration: 300,
          complete: function () {
            $('.search-popup input').focus();
          }
        });
      $('.search-mask')
        .velocity('stop')
        .velocity('transition.fadeIn', {
          duration: 300
        });

      initSearch();
    });
    $('.search-mask, .search-close').on('click', function () {
      closeSearch();
    });
    $(document).on('keydown', function (e) {
      // Escape <=> 27
      if (e.keyCode === Stun.utils.codeToKeyCode('Escape')) {
        closeSearch();
      }
    });
  };

  Stun.utils.pjaxReloadLocalSearch();
}, false);</script><script src="https://cdn.jsdelivr.net/gh/sukkaw/busuanzi@latest/bsz.pure.mini.js" async></script><script src="/js/utils.js?v=2.0.0-rc.0"></script><script src="/js/stun-boot.js?v=2.0.0-rc.0"></script><script src="/js/scroll.js?v=2.0.0-rc.0"></script><script src="/js/header.js?v=2.0.0-rc.0"></script><script src="/js/sidebar.js?v=2.0.0-rc.0"></script><script>if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js?t=1648616400595')
    .then(function () {console.log('ServiceWorker Register Successfully.')})
    .catch(function (e) {console.error(e)});
}
</script></body></html>